{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.00412292 0.00399125 0.00321203 0.00360543 0.00073339 0.00480075\n",
      " 0.00204711 0.00384123 0.00393952 0.00458852]\n",
      "[0.00410131 0.00399143 0.00311073 0.00371278 0.00073109 0.00456488\n",
      " 0.0020282  0.00378043 0.00370883 0.00462336]\n",
      "[0.00423486 0.00417784 0.00326454 0.00365451 0.00072457 0.00472269\n",
      " 0.00203707 0.00381397 0.00389807 0.00458802]\n",
      "[0.00432408 0.00418859 0.00317873 0.0036794  0.00073648 0.00477581\n",
      " 0.00210508 0.0038282  0.00380446 0.00456421]\n",
      "[0.00438328 0.00434139 0.00311194 0.00374511 0.00073059 0.00471842\n",
      " 0.00214717 0.00389611 0.00389448 0.00452844]\n",
      "[0.00422592 0.00411415 0.003118   0.00369346 0.00075003 0.00470351\n",
      " 0.00204963 0.00383097 0.00378777 0.00454625]\n",
      "[0.00424929 0.00414233 0.00305406 0.00364442 0.00072493 0.00466789\n",
      " 0.00206544 0.00388704 0.0037576  0.00459338]\n",
      "[0.00428904 0.0041789  0.00310679 0.00376044 0.00073909 0.00461626\n",
      " 0.00207245 0.00381096 0.00369958 0.00461873]\n",
      "[0.00421405 0.00408972 0.00322794 0.00366967 0.00075474 0.00472908\n",
      " 0.00204348 0.00375213 0.00383852 0.00460375]\n",
      "[0.0041766  0.00413671 0.00307505 0.00377736 0.00073569 0.00452944\n",
      " 0.00208156 0.00380837 0.00365081 0.00459413]\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from random import randrange\n",
    "\n",
    "from sklearn.datasets import make_blobs\n",
    "from sklearn.preprocessing import normalize\n",
    "\n",
    "\n",
    "def distanceNorm(Norm, D_value):\n",
    "    # initialization\n",
    "\n",
    "    # Norm for distance\n",
    "    if Norm == '1':\n",
    "        counter = np.absolute(D_value)\n",
    "        counter = np.sum(counter)\n",
    "    elif Norm == '2':\n",
    "        counter = np.power(D_value, 2)\n",
    "        counter = np.sum(counter)\n",
    "        counter = np.sqrt(counter)\n",
    "    elif Norm == 'Infinity':\n",
    "        counter = np.absolute(D_value)\n",
    "        counter = np.max(counter)\n",
    "    else:\n",
    "        raise Exception('We will program this later......')\n",
    "\n",
    "    return counter\n",
    "\n",
    "\n",
    "def fit(features, labels, iter_ratio, k, norm):\n",
    "    # initialization\n",
    "    (n_samples, n_features) = np.shape(features)\n",
    "    distance = np.zeros((n_samples, n_samples))\n",
    "    weight = np.zeros(n_features)\n",
    "    labels = list(labels)\n",
    "\n",
    "    # compute distance\n",
    "    for index_i in range(n_samples):\n",
    "        for index_j in range(index_i + 1, n_samples):\n",
    "            D_value = features[index_i] - features[index_j]\n",
    "            distance[index_i, index_j] = distanceNorm(norm, D_value)\n",
    "    distance += distance.T\n",
    "\n",
    "    # start iteration\n",
    "    for iter_num in range(int(iter_ratio * n_samples)):\n",
    "        # random extract a sample\n",
    "        index_i = randrange(0, n_samples, 1)\n",
    "        self_features = features[index_i]\n",
    "\n",
    "        # initialization\n",
    "        nearHit = list()\n",
    "        nearMiss = dict()\n",
    "        n_labels = list(set(labels))\n",
    "        termination = np.zeros(len(n_labels))\n",
    "        del n_labels[n_labels.index(labels[index_i])]\n",
    "        for label in n_labels:\n",
    "            nearMiss[label] = list()\n",
    "        distance_sort = list()\n",
    "\n",
    "        # search for nearHit and nearMiss\n",
    "        distance[index_i, index_i] = np.max(distance[index_i])  # filter self-distance\n",
    "        for index in range(n_samples):\n",
    "            distance_sort.append([distance[index_i, index], index, labels[index]])\n",
    "\n",
    "        distance_sort.sort(key=lambda x: x[0])\n",
    "\n",
    "        for index in range(n_samples):\n",
    "            # search nearHit\n",
    "            if distance_sort[index][2] == labels[index_i]:\n",
    "                if len(nearHit) < k:\n",
    "                    nearHit.append(features[distance_sort[index][1]])\n",
    "                else:\n",
    "                    termination[distance_sort[index][2]] = 1\n",
    "            # search nearMiss\n",
    "            elif distance_sort[index][2] != labels[index_i]:\n",
    "                if len(nearMiss[distance_sort[index][2]]) < k:\n",
    "                    nearMiss[distance_sort[index][2]].append(features[distance_sort[index][1]])\n",
    "                else:\n",
    "                    termination[distance_sort[index][2]] = 1\n",
    "\n",
    "            if list(termination).count(0) == 0:\n",
    "                break\n",
    "\n",
    "        # update weight\n",
    "        nearHit_term = np.zeros(n_features)\n",
    "        for x in nearHit:\n",
    "            nearHit += np.abs(np.power(self_features - x, 2))\n",
    "        nearMiss_term = np.zeros((len(list(set(labels))), n_features))\n",
    "        for index, label in enumerate(nearMiss.keys()):\n",
    "            for x in nearMiss[label]:\n",
    "                nearMiss_term[index] += np.abs(np.power(self_features - x, 2))\n",
    "            weight += nearMiss_term[index] / (k * len(nearMiss.keys()))\n",
    "        weight -= nearHit_term / k\n",
    "\n",
    "    # print weight/(iter_ratio*n_samples)\n",
    "    return weight / (iter_ratio * n_samples)\n",
    "\n",
    "\n",
    "def test():\n",
    "    # make_blobs函数是为聚类产生的数据集\n",
    "    # n_samples:表示数据样本点个数,默认值100\n",
    "    # n_features:是每个样本的特征（或属性）数，也表示数据的维度，默认值是2\n",
    "    # centers:表示类别数（标签的种类数），默认值3\n",
    "    #     cluster_std表示每个类别的方差，例如我们希望生成2类数据，其中一类比另一类具有更大的方差，可以将cluster_std设置为[1.0,3.0]，浮点数或者浮点数序列，默认值1.0\n",
    "    # center_box：中心确定之后的数据边界，默认值(-10.0, 10.0)\n",
    "    # shuffle ：将数据进行洗乱，默认值是True\n",
    "    # random_state:官网解释是随机生成器的种子，可以固定生成的数据，给定数之后，每次生成的数据集就是固定的。若不给定值，则由于随机性将导致每次运行程序所获得的的结果可能有所不同。在使用数据生成器练习机器学习算法练习或python练习时建议给定数值。\n",
    "    (features, labels) = make_blobs(n_samples=500, n_features=10, centers=4)\n",
    "    # 归一化特征\n",
    "    features = normalize(X=features, norm='l2', axis=0)\n",
    "\n",
    "    for x in range(1, 11):\n",
    "        weight = fit(features=features, labels=labels, iter_ratio=1, k=5, norm='2')\n",
    "        plt.plot(range(0, 10), weight)\n",
    "        print(weight)\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "if __name__ == '__main__':  test()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}